package com.bdqn.demo;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * 示例3：通过反射获取类的属性
 *
 * @author LILIBO
 * @since 2022-09-15
 */
public class Demo03 {

    public static void main(String[] args) {
        // 通过Class.forName()方法获取Class对象
        Class clazz = null;
        try {
            clazz = Class.forName("com.bdqn.pojo.Student");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // 通过属性名称获得属性
        System.out.println("通过属性名称获得属性: ");
        try {
            // 获得类中的age属性
            Field ageField = clazz.getDeclaredField("age");
            // 判断是否包含public修饰符 Modifier.isPublic()
            // 判断是否包含static修饰符 Modifier.isStatic()
            // 获得属性类型名称 ageField.getType().getName()
            // 获得属性的名称 ageField.getName()
            // 获得某个对象属性的值 ageField.get(Object)
            // 通过反射创建一个类的对象 clazz.newInstance()
            Object stu = clazz.newInstance();
            System.out.println((Modifier.isPublic(ageField.getModifiers()) ? "public " : "") + (Modifier.isStatic(ageField.getModifiers()) ? "static " : "") + ageField.getType().getName() + " " + ageField.getName() + " = " + ageField.get(stu));
            // 通过反射为某个对象设置属性的值
            ageField.set(stu, 20);
            // 再次获取对象中属性的值
            System.out.println("重新赋值后age属性的值为: " + ageField.get(stu));

            // 获得类中的address属性
            Field addressField = clazz.getDeclaredField("address");
            // 上帝视角，跨过访问权限调用
            addressField.setAccessible(true);
            // 通过反射为某个对象设置属性的值
            addressField.set(stu, "湖南省郴州市");
            // 获取stu对象中address属性的值
            System.out.println("赋值后address属性的值为: " + addressField.get(stu));
        } catch (NoSuchFieldException e) {
            // 属性未找到异常
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }

}
